/*
 * Copyright (c) 2025 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License"),
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @addtogroup TeeTrusted
 * @{
 *
 * @brief TEE（Trusted Excution Environment）可信执行环境API。
 *
 * 提供安全能力API，例如可信存储、加解密及可信时间等，用于可信应用程序开发。
 *
 * @since 20
 */

/**
 * @file tee_defines.h
 *
 * @brief 定义TEE的基本数据类型和数据结构。
 *
 * @library NA
 * @kit TEEKit
 * @include <TEEKit/tee_defines.h>
 * @syscap SystemCapability.Tee.TeeClient
 * @since 20
 */

#ifndef __TEE_DEFINES_H
#define __TEE_DEFINES_H

#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef TA_EXPORT
/**
 * @brief 定义TA导出宏。
 *
 * @since 20
 */
#define TA_EXPORT
#endif

/**
 * @brief 定义tee互斥锁句柄类型。
 *
 * @since 20
 */
typedef int *tee_mutex_handle;

/**
 * @brief 定义API级别1.1.1。
 *
 * @since 20
 */
#define API_LEVEL1_1_1 2

/**
 * @brief 定义API级别1.2。
 *
 * @since 20
 */
#define API_LEVEL1_2   3

/**
 * @brief 定义TEE参数数量。
 *
 * @since 20
 */
#define TEE_PARAMS_NUM 4

#ifndef NULL
/**
 * @brief 表示空指针常量。
 *
 * @since 20
 */
#define NULL ((void *)0)
#endif

/**
 * @brief 用于标记未使用的参数。
 *
 * @since 20
 */
#define PARAM_NOT_USED(val) ((void)(val))

/**
 * @brief 枚举TEE参数类型。
 *
 * @since 20
 */
typedef union {
    /**
     * @brief 描述内存引用参数。
     *
     * @since 20
     */
    struct {
        /** 指向内存缓冲区的指针。 */
        void *buffer;
        /** 内存缓冲区的大小。 */
        size_t size;
    } memref;
    /**
     * @brief 描述值类型参数。
     *
     * @since 20
     */
    struct {
        /** 第一个值。 */
        unsigned int a;
        /** 第二个值。 */
        unsigned int b;
    } value;
    /**
     * @brief 描述共享内存引用参数。
     *
     * @since 20
     */
    struct {
        /** 指向共享内存缓冲区的指针。 */
        void *buffer;
        /** 共享内存缓冲区的大小。 */
        size_t size;
    } sharedmem;
} TEE_Param;

/**
 * @brief 定义TEE参数类型组合宏。
 *
 * @since 20
 */
#define TEE_PARAM_TYPES(param0Type, param1Type, param2Type, param3Type) \
    (((param3Type) << 12) | ((param2Type) << 8) | ((param1Type) << 4) | (param0Type))

/**
 * @brief 从参数类型组合中获取指定索引的参数类型。
 *
 * @since 20
 */
#define TEE_PARAM_TYPE_GET(paramTypes, index) (((paramTypes) >> (4U * (index))) & 0x0F)

/**
 * @brief 检查参数类型。
 *
 * @param param_to_check 表示要检查的参数值。
 * @param valid0 表示第一个参数类型要检查的值。
 * @param valid1 表示第二个参数类型要检查的值。
 * @param valid2 表示第三个参数类型要检查的值。
 * @param valid3 表示第四个参数类型要检查的值。
 *
 * @return 如果参数类型正确，返回true。
 *         如果参数类型不正确，返回false。
 *
 * @since 20
 */
static inline bool check_param_type(uint32_t param_to_check, uint32_t valid0, uint32_t valid1, uint32_t valid2,
                                    uint32_t valid3)
{
    return (TEE_PARAM_TYPES(valid0, valid1, valid2, valid3) == param_to_check);
}

/**
 * @brief 枚举TEE参数类型。
 *
 * @since 20
 */
enum TEE_ParamType {
    /** 无参数类型。 */
    TEE_PARAM_TYPE_NONE             = 0x0,
    /** 输入参数类型。 */
    TEE_PARAM_TYPE_VALUE_INPUT      = 0x1,
    /** 输出参数类型。 */
    TEE_PARAM_TYPE_VALUE_OUTPUT     = 0x2,
    /** 输入输出参数类型。 */
    TEE_PARAM_TYPE_VALUE_INOUT      = 0x3,
    /** 输入内存引用参数类型。 */
    TEE_PARAM_TYPE_MEMREF_INPUT     = 0x5,
    /** 输出内存引用参数类型。 */
    TEE_PARAM_TYPE_MEMREF_OUTPUT    = 0x6,
    /** 输入输出内存引用参数类型。 */
    TEE_PARAM_TYPE_MEMREF_INOUT     = 0x7,
    /** 输入ION参数类型。 */
    TEE_PARAM_TYPE_ION_INPUT        = 0x8,
    /** 输入ION单链表参数类型。 */
    TEE_PARAM_TYPE_ION_SGLIST_INPUT = 0x9,
    /** 输入输出共享内存引用参数类型。 */
    TEE_PARAM_TYPE_MEMREF_SHARED_INOUT = 0xa,
    /** 输入资源内存参数类型。 */
    TEE_PARAM_TYPE_RESMEM_INPUT        = 0xc,
    /** 输出资源内存参数类型。 */
    TEE_PARAM_TYPE_RESMEM_OUTPUT       = 0xd,
    /** 输入输出资源内存参数类型。 */
    TEE_PARAM_TYPE_RESMEM_INOUT        = 0xe,
};

/**
 * @brief 用于标记未使用的变量。
 *
 * @since 20
 */
#define S_VAR_NOT_USED(variable) \
    do {                         \
        (void)(variable);        \
    } while (0)

/**
 * @brief 定义一个对象信息。
 *
 * @since 20
 */
typedef struct {
    /** 对象类型。 */
    uint32_t objectType;
    /** 对象大小。 */
    uint32_t objectSize;
    /** 最大对象大小。 */
    uint32_t maxObjectSize;
    /** 对象的使用方式。 */
    uint32_t objectUsage;
    /** 数据大小。 */
    uint32_t dataSize;
    /** 数据位置。 */
    uint32_t dataPosition;
    /** 句柄标志。 */
    uint32_t handleFlags;
} TEE_ObjectInfo;

/**
 * @brief 定义一个对象属性。
 *
 * @since 20
 */
typedef struct {
    /** 属性ID。 */
    uint32_t attributeID;
    /**
     * @brief 属性内容。
     *
     * @since 20
     */
    union {
        /**
         * @brief 引用类型的属性内容。
         *
         * @since 20
         */
        struct {
            /** 缓冲区指针。 */
            void *buffer;
            /** 缓冲区长度。 */
            size_t length;
        } ref;
        /**
         * @brief 值类型的属性内容。
         *
         * @since 20
         */
        struct {
            /** 第一个值。 */
            uint32_t a;
            /** 第二个值。 */
            uint32_t b;
        } value;
    } content;
} TEE_Attribute;

/**
 * @brief 枚举对象属性类型，用于加密操作。
 *
 * @since 20
 */
enum TEE_ObjectAttribute {
    /** 密钥值属性。 */
    TEE_ATTR_SECRET_VALUE          = 0xC0000000,
    /** RSA模数属性。 */
    TEE_ATTR_RSA_MODULUS           = 0xD0000130,
    /** RSA公钥指数属性。 */
    TEE_ATTR_RSA_PUBLIC_EXPONENT   = 0xD0000230,
    /** RSA私钥指数属性。 */
    TEE_ATTR_RSA_PRIVATE_EXPONENT  = 0xC0000330,
    /** RSA素数prime1属性。 */
    TEE_ATTR_RSA_PRIME1            = 0xC0000430,
    /** RSA素数prime2属性。 */
    TEE_ATTR_RSA_PRIME2            = 0xC0000530,
    /** RSA指数 exponent1属性。 */
    TEE_ATTR_RSA_EXPONENT1         = 0xC0000630,
    /** RSA指数 exponent2属性。 */
    TEE_ATTR_RSA_EXPONENT2         = 0xC0000730,
    /** RSA系数属性。 */
    TEE_ATTR_RSA_COEFFICIENT       = 0xC0000830,
    /** RSA MGF1哈希函数属性。 */
    TEE_ATTR_RSA_MGF1_HASH         = 0xF0000830,
    /** DSA主素数属性。 */
    TEE_ATTR_DSA_PRIME             = 0xD0001031,
    /** DSA子素数属性。 */
    TEE_ATTR_DSA_SUBPRIME          = 0xD0001131,
    /** DSA基数属性。 */
    TEE_ATTR_DSA_BASE              = 0xD0001231,
    /** DSA公钥值属性。 */
    TEE_ATTR_DSA_PUBLIC_VALUE      = 0xD0000131,
    /** DSA私钥值属性。 */
    TEE_ATTR_DSA_PRIVATE_VALUE     = 0xC0000231,
    /** DH主素数属性。 */
    TEE_ATTR_DH_PRIME              = 0xD0001032,
    /** DH子素数属性。 */
    TEE_ATTR_DH_SUBPRIME           = 0xD0001132,
    /** DH基数属性。 */
    TEE_ATTR_DH_BASE               = 0xD0001232,
    /** DH私钥位长度属性。 */
    TEE_ATTR_DH_X_BITS             = 0xF0001332,
    /** DH公钥值属性。 */
    TEE_ATTR_DH_PUBLIC_VALUE       = 0xD0000132,
    /** DH私钥值属性。 */
    TEE_ATTR_DH_PRIVATE_VALUE      = 0xC0000232,
    /** RSA OAEP标签属性。 */
    TEE_ATTR_RSA_OAEP_LABEL        = 0xD0000930,
    /** RSA PSS盐长度属性。 */
    TEE_ATTR_RSA_PSS_SALT_LENGTH   = 0xF0000A30,
    /** ECC公钥X坐标属性。 */
    TEE_ATTR_ECC_PUBLIC_VALUE_X    = 0xD0000141,
    /** ECC公钥Y坐标属性。 */
    TEE_ATTR_ECC_PUBLIC_VALUE_Y    = 0xD0000241,
    /** ECC私钥值属性。 */
    TEE_ATTR_ECC_PRIVATE_VALUE     = 0xC0000341,
    /** ECC曲线属性。 */
    TEE_ATTR_ECC_CURVE             = 0xF0000441,
    /** ED25519上下文属性。 */
    TEE_ATTR_ED25519_CTX           = 0xD0000643,
    /** ED25519公钥值属性。 */
    TEE_ATTR_ED25519_PUBLIC_VALUE  = 0xD0000743,
    /** ED25519私钥值属性。 */
    TEE_ATTR_ED25519_PRIVATE_VALUE = 0xC0000843,
    /** ED25519PH（预哈希）属性。 */
    TEE_ATTR_ED25519_PH            = 0xF0000543,
    /** X25519公钥值属性。 */
    TEE_ATTR_X25519_PUBLIC_VALUE   = 0xD0000944,
    /** X25519私钥值属性。 */
    TEE_ATTR_X25519_PRIVATE_VALUE  = 0xC0000A44,
    /** PBKDF2 HMAC密码属性。 */
    TEE_ATTR_PBKDF2_HMAC_PASSWORD  = 0xD0000133,
    /** PBKDF2 HMAC盐属性。 */
    TEE_ATTR_PBKDF2_HMAC_SALT      = 0xD0000134,
    /** PRF标签属性。 */
    TEE_ATTR_PRF_LABEL             = 0xD0000136,
    /** PRF种子属性。 */
    TEE_ATTR_PRF_SEED              = 0xD0000137,
    /** PRF哈希算法属性。 */
    TEE_ATTR_PRF_HASH_ALGORITHM    = 0xF0000138,
    /** HKDF盐属性。 */
    TEE_ATTR_HKDF_SALT             = 0xD0000946,
    /** HKDF附加信息属性。 */
    TEE_ATTR_HKDF_INFO             = 0xD0000A46,
    /** PBKDF2 HMAC摘要算法属性。 */
    TEE_ATTR_PBKDF2_HMAC_DIGEST    = 0xF0000135,
    /** HKDF哈希算法属性。 */
    TEE_ATTR_HKDF_HASH_ALGORITHM   = 0xF0000B46,
    /** KDF密钥长度属性。 */
    TEE_ATTR_KDF_KEY_SIZE          = 0xF0000C46,
};

/**
 * @brief 枚举对象的类型。
 *
 * @since 20
 */
enum TEE_ObjectType {
    /** AES对象类型。 */
    TEE_TYPE_AES                = 0xA0000010,
    /** DES对象类型。 */
    TEE_TYPE_DES                = 0xA0000011,
    /** 3DES对象类型。 */
    TEE_TYPE_DES3               = 0xA0000013,
    /** HMAC MD5对象类型。 */
    TEE_TYPE_HMAC_MD5           = 0xA0000001,
    /** HMAC SHA1对象类型。 */
    TEE_TYPE_HMAC_SHA1          = 0xA0000002,
    /** HMAC SHA224对象类型。 */
    TEE_TYPE_HMAC_SHA224        = 0xA0000003,
    /** HMAC SHA256对象类型。 */
    TEE_TYPE_HMAC_SHA256        = 0xA0000004,
    /** HMAC SHA384对象类型。 */
    TEE_TYPE_HMAC_SHA384        = 0xA0000005,
    /** HMAC SHA512对象类型。 */
    TEE_TYPE_HMAC_SHA512        = 0xA0000006,
    /** RSA公钥对象类型。 */
    TEE_TYPE_RSA_PUBLIC_KEY     = 0xA0000030,
    /** RSA密钥对对象类型。 */
    TEE_TYPE_RSA_KEYPAIR        = 0xA1000030,
    /** DSA公钥对象类型。 */
    TEE_TYPE_DSA_PUBLIC_KEY     = 0xA0000031,
    /** DSA密钥对对象类型。 */
    TEE_TYPE_DSA_KEYPAIR        = 0xA1000031,
    /** DH密钥对对象类型。 */
    TEE_TYPE_DH_KEYPAIR         = 0xA1000032,
    /** 通用密钥对象类型。 */
    TEE_TYPE_GENERIC_SECRET     = 0xA0000000,
    /** 数据对象类型。 */
    TEE_TYPE_DATA               = 0xA1000033,
    /** 数据对象类型（GP1.1） */
    TEE_TYPE_DATA_GP1_1         = 0xA00000BF,
    /** ECDSA公钥对象类型。 */
    TEE_TYPE_ECDSA_PUBLIC_KEY   = 0xA0000041,
    /** ECDSA密钥对对象类型。 */
    TEE_TYPE_ECDSA_KEYPAIR      = 0xA1000041,
    /** ECDH公钥对象类型。 */
    TEE_TYPE_ECDH_PUBLIC_KEY    = 0xA0000042,
    /** ECDH密钥对对象类型。 */
    TEE_TYPE_ECDH_KEYPAIR       = 0xA1000042,
    /** ED25519公钥对象类型。 */
    TEE_TYPE_ED25519_PUBLIC_KEY = 0xA0000043,
    /** ED25519密钥对对象类型。 */
    TEE_TYPE_ED25519_KEYPAIR    = 0xA1000043,
    /** X25519公钥对象类型。 */
    TEE_TYPE_X25519_PUBLIC_KEY  = 0xA0000044,
    /** X25519密钥对对象类型。 */
    TEE_TYPE_X25519_KEYPAIR     = 0xA1000044,
    /** SM2 DSA公钥对象类型。 */
    TEE_TYPE_SM2_DSA_PUBLIC_KEY = 0xA0000045,
    /** SM2 DSA密钥对对象类型。 */
    TEE_TYPE_SM2_DSA_KEYPAIR    = 0xA1000045,
    /** SM2 KEP公钥对象类型。 */
    TEE_TYPE_SM2_KEP_PUBLIC_KEY = 0xA0000046,
    /** SM2 KEP密钥对对象类型。 */
    TEE_TYPE_SM2_KEP_KEYPAIR    = 0xA1000046,
    /** SM2 PKE公钥对象类型。 */
    TEE_TYPE_SM2_PKE_PUBLIC_KEY = 0xA0000047,
    /** SM2 PKE密钥对对象类型。 */
    TEE_TYPE_SM2_PKE_KEYPAIR    = 0xA1000047,
    /** HMAC SM3对象类型。 */
    TEE_TYPE_HMAC_SM3           = 0xA0000007,
    /** SM4对象类型。 */
    TEE_TYPE_SM4                = 0xA0000014,
    /** HKDF对象类型。 */
    TEE_TYPE_HKDF               = 0xA000004A,
    /** SIP哈希对象类型。 */
    TEE_TYPE_SIP_HASH           = 0xF0000002,
    /** PBKDF2 HMAC对象类型。 */
    TEE_TYPE_PBKDF2_HMAC        = 0xF0000004,
    /** PRF对象类型。 */
    TEE_TYPE_PRF                = 0xF0000005,
    /** 损坏的对象类型。 */
    TEE_TYPE_CORRUPTED_OBJECT = 0xA00000BE,
};

/**
 * @brief 定义对象的最大名称长度。
 *
 * @since 20
 */
#define OBJECT_NAME_LEN_MAX 256

/**
 * @brief 定义一个对象句柄。
 *
 * @since 20
 */
struct __TEE_ObjectHandle {
    /** 指向对象数据的指针。 */
    void *dataPtr;
    /** 对象数据的长度。 */
    uint32_t dataLen;
    /** 对象数据的名称，最大长度为255。 */
    uint8_t dataName[OBJECT_NAME_LEN_MAX];
    /** 指向对象信息的指针。 */
    TEE_ObjectInfo *ObjectInfo;
    /** 指向对象属性的指针。 */
    TEE_Attribute *Attribute;
    /** 对象属性的长度。 */
    uint32_t attributesLen;
    /** 对象的CRT模式。 */
    uint32_t CRTMode;
    /** 信息属性文件描述符。 */
    void *infoattrfd;
    /** 对象生成标志。 */
    uint32_t generate_flag;
    /** 存储ID。 */
    uint32_t storage_id;
};

/**
 * @brief 定义<b>__TEE_ObjectHandle</b>结构体。
 *
 * @see __TEE_ObjectHandle
 *
 * @since 20
 */
typedef struct __TEE_ObjectHandle *TEE_ObjectHandle;

/**
 * @brief 定义节点长度。
 *
 * @since 20
 */
#define NODE_LEN 8

/**
 * @brief 定义TA的UUID。
 *
 * @since 20
 */
typedef struct tee_uuid {
    /** 时间低位部分。 */
    uint32_t timeLow;
    /** 时间中间部分。 */
    uint16_t timeMid;
    /** 时间高位和版本部分。 */
    uint16_t timeHiAndVersion;
    /** 时钟序列和节点部分。 */
    uint8_t clockSeqAndNode[NODE_LEN];
} TEE_UUID;

/**
 * @brief 定义spawn UUID的类型。
 *
 * @since 20
 */
typedef struct spawn_uuid {
    /** UUID是否有效标志。 */
    uint64_t uuid_valid;
    /** UUID值。 */
    TEE_UUID uuid;
} spawn_uuid_t;

/**
 * @brief 枚举 TEEKit API 中使用的返回码。
 *
 * @since 20
 */
enum TEE_Result_Value {
    /** 操作成功。 */
    TEE_SUCCESS                        = 0x00000000,
    /** 命令无效。 */
    TEE_ERROR_INVALID_CMD              = 0x00000001,
    /** 服务不存在。 */
    TEE_ERROR_SERVICE_NOT_EXIST        = 0x00000002,
    /** 会话不存在。 */
    TEE_ERROR_SESSION_NOT_EXIST        = 0x00000003,
    /** 会话数超过限制。 */
    TEE_ERROR_SESSION_MAXIMUM          = 0x00000004,
    /** 服务已被注册。 */
    TEE_ERROR_REGISTER_EXIST_SERVICE   = 0x00000005,
    /** 发生内部错误。 */
    TEE_ERROR_TARGET_DEAD_FATAL        = 0x00000006,
    /** 数据读取失败。 */
    TEE_ERROR_READ_DATA                = 0x00000007,
    /** 数据写入失败。 */
    TEE_ERROR_WRITE_DATA               = 0x00000008,
    /** 截断对象失败。 */
    TEE_ERROR_TRUNCATE_OBJECT          = 0x00000009,
    /** 数据定位失败。 */
    TEE_ERROR_SEEK_DATA                = 0x0000000A,
    /** 数据同步失败。 */
    TEE_ERROR_SYNC_DATA                = 0x0000000B,
    /** 重命名文件失败。 */
    TEE_ERROR_RENAME_OBJECT            = 0x0000000C,
    /** 加载TA时发生错误。 */
    TEE_ERROR_TRUSTED_APP_LOAD_ERROR   = 0x0000000D,
    /** TA类型与加载模式不匹配。 */
    TEE_ERROR_OTRP_LOAD_NOT_MATCHED    = 0x80000100,
    /** 未打开会话的OTRP服务数量超限。 */
    TEE_ERROR_OTRP_LOAD_EXCEED         = 0x80000101,
    /** 加载命令的UUID与sec文件不一致。 */
    TEE_ERROR_OTRP_ACCESS_DENIED       = 0x80000102,
    /** OTRP服务已过期。 */
    TEE_ERROR_OTRP_SERVICE_AGED        = 0x80000103,
    /** 存储数据时发生I/O错误。 */
    TEE_ERROR_STORAGE_EIO              = 0x80001001,
    /** 存储区域不可用。 */
    TEE_ERROR_STORAGE_EAGAIN           = 0x80001002,
    /** 操作目标不是目录。 */
    TEE_ERROR_STORAGE_ENOTDIR          = 0x80001003,
    /** 不能对目录执行该操作。 */
    TEE_ERROR_STORAGE_EISDIR           = 0x80001004,
    /** 系统打开的文件数超限。 */
    TEE_ERROR_STORAGE_ENFILE           = 0x80001005,
    /** 进程打开的文件数超限。 */
    TEE_ERROR_STORAGE_EMFILE           = 0x80001006,
    /** 存储区域为只读。 */
    TEE_ERROR_STORAGE_EROFS            = 0x80001007,
    /** 文件对象已回滚。 */
    TEE_ERROR_STORAGE_EROLLBACK        = 0x80001008,
    /** 文件路径不正确。 */
    TEE_ERROR_STORAGE_PATH_WRONG       = 0x8000100A,
    /** 服务消息队列溢出。 */
    TEE_ERROR_MSG_QUEUE_OVERFLOW       = 0x8000100B,
    /**TA创建的子线程无法访问服务。 */
    TEE_ERROR_SUBTHREAD_ACCESS         = 0x8000100C,
    /** 启用备份功能，原分区未激活。 */
    TEE_ERROR_ORIGIN_PARTITION_INACTIVE = 0x8000100D,
    /** 启用备份功能，备份分区未激活。 */
    TEE_ERROR_BACKUP_PARTITION_INACTIVE = 0x8000100E,
    /** 文件对象已损坏。 */
    TEE_ERROR_CORRUPT_OBJECT           = 0xF0100001,
    /** 存储区域不可用。 */
    TEE_ERROR_STORAGE_NOT_AVAILABLE    = 0xF0100003,
    /** 密文不正确。 */
    TEE_ERROR_CIPHERTEXT_INVALID       = 0xF0100006,
    /** 套接字连接协议错误。 */
    TEE_ISOCKET_ERROR_PROTOCOL         = 0xF1007001,
    /** 远端关闭了套接字。 */
    TEE_ISOCKET_ERROR_REMOTE_CLOSED    = 0xF1007002,
    /** 套接字连接超时。 */
    TEE_ISOCKET_ERROR_TIMEOUT          = 0xF1007003,
    /** 套接字连接资源不足。 */
    TEE_ISOCKET_ERROR_OUT_OF_RESOURCES = 0xF1007004,
    /** 套接字缓冲区过大。 */
    TEE_ISOCKET_ERROR_LARGE_BUFFER     = 0xF1007005,
    /** 套接字连接产生警告。 */
    TEE_ISOCKET_WARNING_PROTOCOL       = 0xF1007006,
    /** 通用错误。 */
    TEE_ERROR_GENERIC                  = 0xFFFF0000,
    /** 拒绝访问。 */
    TEE_ERROR_ACCESS_DENIED            = 0xFFFF0001,
    /** 操作被取消。 */
    TEE_ERROR_CANCEL                   = 0xFFFF0002,
    /** 发生访问冲突。 */
    TEE_ERROR_ACCESS_CONFLICT          = 0xFFFF0003,
    /** 数据量超限。 */
    TEE_ERROR_EXCESS_DATA              = 0xFFFF0004,
    /** 数据格式错误。 */
    TEE_ERROR_BAD_FORMAT               = 0xFFFF0005,
    /** 参数错误。 */
    TEE_ERROR_BAD_PARAMETERS           = 0xFFFF0006,
    /** 当前状态不支持该操作。 */
    TEE_ERROR_BAD_STATE                = 0xFFFF0007,
    /** 未找到目标项。 */
    TEE_ERROR_ITEM_NOT_FOUND           = 0xFFFF0008,
    /** API未实现。 */
    TEE_ERROR_NOT_IMPLEMENTED          = 0xFFFF0009,
    /** API不支持。 */
    TEE_ERROR_NOT_SUPPORTED            = 0xFFFF000A,
    /** 无可用数据。 */
    TEE_ERROR_NO_DATA                  = 0xFFFF000B,
    /** 内存不足。 */
    TEE_ERROR_OUT_OF_MEMORY            = 0xFFFF000C,
    /** 系统繁忙。 */
    TEE_ERROR_BUSY                     = 0xFFFF000D,
    /** 与目标通信失败。 */
    TEE_ERROR_COMMUNICATION            = 0xFFFF000E,
    /** 安全错误。 */
    TEE_ERROR_SECURITY                 = 0xFFFF000F,
    /** 缓冲区不足。 */
    TEE_ERROR_SHORT_BUFFER             = 0xFFFF0010,
    /** 外部操作已取消。 */
    TEE_ERROR_EXTERNAL_CANCEL          = 0xFFFF0011,
    /** 服务处于挂起状态（异步）。 */
    TEE_PENDING                        = 0xFFFF2000,
    /** 服务处于挂起状态（备用）。 */
    TEE_PENDING2                       = 0xFFFF2001,
    /** 保留。 */
    TEE_PENDING3                       = 0xFFFF2002,
    /** 操作超时。 */
    TEE_ERROR_TIMEOUT                  = 0xFFFF3001,
    /** 数据溢出。 */
    TEE_ERROR_OVERFLOW                 = 0xFFFF300f,
    /** TA崩溃。 */
    TEE_ERROR_TARGET_DEAD              = 0xFFFF3024,
    /** 空间不足。 */
    TEE_ERROR_STORAGE_NO_SPACE         = 0xFFFF3041,
    /** MAC校验失败。 */
    TEE_ERROR_MAC_INVALID              = 0xFFFF3071,
    /** 签名验证失败。 */
    TEE_ERROR_SIGNATURE_INVALID        = 0xFFFF3072,
    /** 证书验证失败。 */
    TEE_ERROR_CERTIFICATE_INVALID      = 0xFFFF3073,
    /** 被CFC中断，检测到控制流异常。 */
    TEE_CLIENT_INTR                    = 0xFFFF4000,
    /** 时间未设置。 */
    TEE_ERROR_TIME_NOT_SET             = 0xFFFF5000,
    /** 需要重设时间。 */
    TEE_ERROR_TIME_NEEDS_RESET         = 0xFFFF5001,
    /** 系统错误。 */
    TEE_FAIL                           = 0xFFFF5002,
    /** 定时器错误码的基础值。 */
    TEE_ERROR_TIMER                    = 0xFFFF6000,
    /** 创建定时器失败。 */
    TEE_ERROR_TIMER_CREATE_FAILED      = 0xFFFF6001,
    /** 销毁定时器失败。 */
    TEE_ERROR_TIMER_DESTROY_FAILED     = 0xFFFF6002,
    /** 未找到定时器。 */
    TEE_ERROR_TIMER_NOT_FOUND          = 0xFFFF6003,
    /** RPMB错误码的基础值。 */
    TEE_ERROR_RPMB_BASE                = 0xFFFF7000,
    /** RPMB操作通用错误。 */
    TEE_ERROR_RPMB_GENERIC             = 0xFFFF7001,
    /** RPMB操作中MAC校验失败。 */
    TEE_ERROR_RPMB_MAC_FAIL            = 0xFFFF7002,
    /** RPMB操作中计数器无效。 */
    TEE_ERROR_RPMB_COUNTER_FAIL        = 0xFFFF7003,
    /** RPMB操作中地址检查失败。 */
    TEE_ERROR_RPMB_ADDR_FAIL           = 0xFFFF7004,
    /** RPMB写入失败。 */
    TEE_ERROR_RPMB_WRITE_FAIL          = 0xFFFF7005,
    /** RPMB读取失败。 */
    TEE_ERROR_RPMB_READ_FAIL           = 0xFFFF7006,
    /** RPMB中未配置密钥。 */
    TEE_ERROR_RPMB_KEY_NOT_PROGRAM     = 0xFFFF7007,
    /** RPMB响应中消息类型不正确。 */
    TEE_ERROR_RPMB_RESP_UNEXPECT_MSGTYPE = 0xFFFF7100,
    /** RPMB响应中数据块数量不正确。 */
    TEE_ERROR_RPMB_RESP_UNEXPECT_BLKCNT = 0xFFFF7101,
    /** RPMB响应中块索引不正确。 */
    TEE_ERROR_RPMB_RESP_UNEXPECT_BLKIDX = 0xFFFF7102,
    /** RPMB响应中写计数不正确。 */
    TEE_ERROR_RPMB_RESP_UNEXPECT_WRCNT = 0xFFFF7103,
    /** RPMB响应中随机数不正确。 */
    TEE_ERROR_RPMB_RESP_UNEXPECT_NONCE = 0xFFFF7104,
    /** RPMB响应中MAC不正确。 */
    TEE_ERROR_RPMB_RESP_UNEXPECT_MAC   = 0xFFFF7105,
    /** RPMB中未找到文件。 */
    TEE_ERROR_RPMB_FILE_NOT_FOUND      = 0xFFFF7106,
    /** RPMB空间不足。 */
    TEE_ERROR_RPMB_NOSPC               = 0xFFFF7107,
    /**TA超过其可用的RPMB空间限制。 */
    TEE_ERROR_RPMB_SPC_CONFLICT        = 0xFFFF7108,
    /** RPMB服务不可用。 */
    TEE_ERROR_RPMB_NOT_AVAILABLE       = 0xFFFF7109,
    /** RPMB分区已损坏。 */
    TEE_ERROR_RPMB_DAMAGED             = 0xFFFF710A,
    /** TUI（可信用户界面）正在使用中。 */
    TEE_ERROR_TUI_IN_USE               = 0xFFFF7110,
    /** TUI响应中切换通道消息不正确。 */
    TEE_ERROR_TUI_SWITCH_CHANNAL       = 0xFFFF7111,
    /** TUI响应中配置驱动消息不正确。 */
    TEE_ERROR_TUI_CFG_DRIVER           = 0xFFFF7112,
    /** TUI事件无效。 */
    TEE_ERROR_TUI_INVALID_EVENT        = 0xFFFF7113,
    /** TUI响应中轮询事件消息不正确。 */
    TEE_ERROR_TUI_POLL_EVENT           = 0xFFFF7114,
    /** TUI被取消。 */
    TEE_ERROR_TUI_CANCELED             = 0xFFFF7115,
    /** TUI已退出。 */
    TEE_ERROR_TUI_EXIT                 = 0xFFFF7116,
    /** TUI不可用。 */
    TEE_ERROR_TUI_NOT_AVAILABLE        = 0xFFFF7117,
    /** 安全闪存不可用。 */
    TEE_ERROR_SEC_FLASH_NOT_AVAILABLE  = 0xFFFF7118,
    /** 安全元素（SE）服务崩溃或未启用。 */
    TEE_ERROR_SESRV_NOT_AVAILABLE      = 0xFFFF7119,
    /** 生物识别服务不可用。 */
    TEE_ERROR_BIOSRV_NOT_AVAILABLE     = 0xFFFF711A,
    /** 根信任服务不可用。 */
    TEE_ERROR_ROTSRV_NOT_AVAILABLE     = 0xFFFF711B,
    /** TA防回滚服务不可用。 */
    TEE_ERROR_ARTSRV_NOT_AVAILABLE     = 0xFFFF711C,
    /** 硬件安全模块（HSM）服务不可用。 */
    TEE_ERROR_HSMSRV_NOT_AVAILABLE     = 0xFFFF711D,
    /** REE VRPMB代理校验magic失败，可能为缓存失败。 */
    TEE_ERROR_VRPMB_AGENT_FAIL         = 0xFFFF7200,
    /** REE SSD驱动读写失败。 */
    TEE_ERROR_VRPMB_RW_FAIL            = 0xFFFF7201,
    /** VRPMB超级块MAC校验失败。 */
    TEE_ERROR_VRPMB_SUPER_MAC_FAILED   = 0xFFFF7202,
    /** 拒绝写入VRPMB。 */
    TEE_ERROR_VRPMB_WRITE_REJECT       = 0xFFFF7203,
    /** AntiRoot响应验证失败。 */
    TEE_ERROR_ANTIROOT_RSP_FAIL        = 0xFFFF9110,
    /** AntiRoot调用命令错误。 */
    TEE_ERROR_ANTIROOT_INVOKE_ERROR    = 0xFFFF9111,
    /** 审计失败。 */
    TEE_ERROR_AUDIT_FAIL               = 0xFFFF9112,
    /** 未使用。 */
    TEE_FAIL2                          = 0xFFFF9113,
    /** IPC通道溢出错误。 */
    TEE_ERROR_IPC_OVERFLOW             = 0xFFFF9114,
    /** APM错误。 */
    TEE_ERROR_APM                           = 0xFFFF9115,
    /** CA授权文件不存在。 */
    TEE_ERROR_CA_AUTHFILE_NOT_EXIST         = 0xFFFF9116,
    /** CA调用者访问被拒绝。 */
    TEE_ERROR_CA_CALLER_ACCESS_DENIED       = 0xFFFF9117,
    /** TA格式无效。 */
    TEE_ERROR_INVALID_TA_FORMAT             = 0xFFFF9118,
    /** 本地DSTB服务签名报告错误。 */
    TEE_DSTB_LOCAL_SIGN_REPORT_ERROR        = 0xFFFF9200,
    /** 远程DSTB服务签名报告错误。 */
    TEE_DSTB_REMOTE_SIGN_REPORT_ERROR       = 0xFFFF9201,
    /** 本地DSTB报告证书链错误。 */
    TEE_DSTB_LOCAL_REPORT_CERT_CHAIN_ERROR  = 0xFFFF9202,
    /** 远程DSTB报告证书链错误。 */
    TEE_DSTB_REMOTE_REPORT_CERT_CHAIN_ERROR = 0xFFFF9203,
    /** 本地DSTB报告验证错误。 */
    TEE_DSTB_LOCAL_REPORT_VERIFY_ERROR      = 0xFFFF9204,
    /** 远程DSTB报告验证错误。 */
    TEE_DSTB_REMOTE_REPORT_VERIFY_ERROR     = 0xFFFF9205,
    /** 本地DSTB验证证书链错误。 */
    TEE_DSTB_LOCAL_CERT_CHAIN_VERIFY_ERROR  = 0xFFFF9206,
    /** 远程DSTB验证证书链错误。 */
    TEE_DSTB_REMOTE_CERT_CHAIN_VERIFY_ERROR = 0xFFFF9207,
    /** 本地DSTB密钥版本错误。 */
    TEE_DSTB_LOCAL_INVALID_KEY_VERSION_ERROR = 0xFFFF9208,
    /** 远程DSTB密钥版本错误。 */
    TEE_DSTB_REMOTE_INVALID_KEY_VERSION_ERROR = 0xFFFF9209,
    /** UDID无效。 */
    TEE_DSTB_INVALID_UDID                   = 0xFFFF920A,
    /** DSTB派生密钥错误。 */
    TEE_DSTB_DERIVE_KEY_ERROR               = 0xFFFF920B,
    /** REE的DSTB服务错误。 */
    TEE_DSTB_REE_SRV_ERROR                  = 0xFFFF920C,
    /** Anti-Rollback 导致TA加载失败。 */
    TEE_ERROR_TA_ANTI_ROLLBACK              = 0xFFFF920D,
    /** 与close_session冲突导致open_session重试。 */
    TEE_ERROR_RETRY_OPEN_SESSION            = 0xFFFF920E,
    /** 加载TA控制文件失败。 */
    TEE_ERROR_TA_CTRL_FILE_LOAD_FAIL        = 0xFFFF920F,
    /** 验证TA控制文件失败。 */
    TEE_ERROR_TA_CTRL_FILE_VERIFY_FAIL      = 0xFFFF9210,
    /** TA版本低于控制文件中的版本。 */
    TEE_ERROR_TA_VER_BELOW_CONTROL_VER      = 0xFFFF9211,
    /** 本地DSTB证书链有效性检查失败。 */
    TEE_DSTB_LOCAL_CERT_VALIDITY_ERROR      = 0xFFFF9212,
    /** 远程DSTB证书链有效性检查失败。 */
    TEE_DSTB_REMOTE_CERT_VALIDITY_ERROR     = 0xFFFF9213,
};

/**
 * @brief 登录类型定义
 *
 * @since 20
 */
enum TEE_LoginMethod {
    /** 公共登录方式。 */
    TEE_LOGIN_PUBLIC = 0x0,
    /** 用户登录方式。 */
    TEE_LOGIN_USER,
    /** 用户组登录方式。 */
    TEE_LOGIN_GROUP,
    /** 应用登录方式。 */
    TEE_LOGIN_APPLICATION = 0x4,
    /** 用户-应用联合登录方式。 */
    TEE_LOGIN_USER_APPLICATION = 0x5,
    /** 用户组-应用联合登录方式。 */
    TEE_LOGIN_GROUP_APPLICATION = 0x6,
    /** 自定义登录方式。 */
    TEE_LOGIN_IDENTIFY = 0x7,
    /** 源自Linux内核的登录方式。 */
    TEEK_LOGIN_IDENTIFY = 0x80000001,
};

/**
 * @brief 定义TEE身份。
 *
 * @since 20
 */
typedef struct {
    /** 登录类型。 */
    uint32_t login;
    /** 身份的UUID。 */
    TEE_UUID uuid;
} TEE_Identity;

/**
 * @brief 定义返回值类型。
 *
 * @since 20
 */
typedef uint32_t TEE_Result;

/**
 * @brief 定义返回值类型。
 *
 * @since 20
 */
typedef TEE_Result TEEC_Result;

/**
 * @brief 定义TEE的来源标志。
 *
 * @since 20
 */
#define TEE_ORIGIN_TEE             0x00000003

/**
 * @brief 定义受信应用程序的来源标志。
 *
 * @since 20
 */
#define TEE_ORIGIN_TRUSTED_APP     0x00000004

#ifndef _TEE_TA_SESSION_HANDLE
/**
 * @brief 定义TA会话句柄。
 *
 * @since 20
 */
#define _TEE_TA_SESSION_HANDLE

/**
 * @brief 定义TA会话句柄。
 *
 * @since 20
 */
typedef uint32_t TEE_TASessionHandle;
#endif

/**
 * @brief 定义指向TEE_ObjectEnumHandle的指针。
 *
 * @see __TEE_ObjectEnumHandle
 *
 * @since 20
 */
typedef struct __TEE_ObjectEnumHandle *TEE_ObjectEnumHandle;

/**
 * @brief 定义指向__TEE_OperationHandle的指针。
 *
 * @see __TEE_OperationHandle
 *
 * @since 20
 */
typedef struct __TEE_OperationHandle *TEE_OperationHandle;

/**
 * @brief 定义无限超时时间。
 *
 * @since 20
 */
#define TEE_TIMEOUT_INFINITE (0xFFFFFFFF)

/**
 * @brief 定义TEE时间。
 *
 * @since 20
 */
typedef struct {
    /** 秒数。 */
    uint32_t seconds;
    /** 毫秒数。 */
    uint32_t millis;
} TEE_Time;

/**
 * @brief 定义TEE的日期时间。
 *
 * @since 20
 */
typedef struct {
    /** 秒数。 */
    int32_t seconds;
    /** 毫秒数。 */
    int32_t millis;
    /** 分钟数。 */
    int32_t min;
    /** 小时数。 */
    int32_t hour;
    /** 日数。 */
    int32_t day;
    /** 月份。 */
    int32_t month;
    /** 年份。 */
    int32_t year;
} TEE_Date_Time;

/**
 * @brief 定义TEE的定时器属性。
 *
 * @since 20
 */
typedef struct {
    /** 定时器类型。 */
    uint32_t type;
    /** 定时器ID。 */
    uint32_t timer_id;
    /** 定时器类别。 */
    uint32_t timer_class;
    /** 保留字段。 */
    uint32_t reserved2;
} TEE_timer_property;

#ifdef __cplusplus
}
#endif

#endif
/** @} */